iT邦幫忙

2025 iThome 鐵人賽

DAY 29
0
Security

我的30天資安攻之路防身修練:實戰×工具×AI全紀錄系列 第 29

【DAY29】技術實作/打造一個 AI 釣魚郵件偵測器

  • 分享至 

  • xImage
  •  

在過去,釣魚郵件常常因為語法錯誤、語氣生硬而容易被識破。隨著大型語言模型(LLM,例如 GPT 系列)的崛起,攻擊者現在可以輕易地生成語氣自然、內文流暢、甚至針對特定目標客製化的釣魚郵件,使得傳統的關鍵字或規則過濾變得越來越困難。

用 Python 和 OpenAI 的 API 來建立一個簡單的偵測腳本。你可以輕易地將它換成 Google Gemini 或其他大型語言模型的 API。

步驟 1:環境設置

https://ithelp.ithome.com.tw/upload/images/20251027/20168357MoePplmwaG.png

步驟 2:撰寫 Python 程式碼

接收郵件的內文,然後呼叫 AI 進行分析。核心在於要給 AI 一個非常明確的「指令」(Prompt),告訴它要扮演什麼角色,以及要分析哪些面向。

. 核心設定與初始化
import os / import openai:

導入 Python 的 os 模組來讀取環境變數(API 金鑰)。

導入 openai 函式庫,這是呼叫 OpenAI 模型的官方工具。

client = openai.OpenAI(api_key=os.environ.get("OPENAI_API_KEY")):

初始化 OpenAI 客戶端物件(client)。

它會自動從環境變數 OPENAI_API_KEY 中讀取您的金鑰。這是最佳實踐,因為它避免將金鑰寫死在程式碼中。


  1. 函式定義與輸入
    def analyze_email_phishing(email_subject, email_body)::

定義主要的偵測函式,接收兩個參數:郵件的主旨 (email_subject) 和內文 (email_body)。

user_message = f"郵件主旨:{email_subject}\n\n郵件內文:\n{email_body}":

將主旨和內文組合成一個乾淨的單一字串,這是要傳遞給 AI 的使用者輸入。
https://ithelp.ithome.com.tw/upload/images/20251027/20168357yI5vs66jZG.png
https://ithelp.ithome.com.tw/upload/images/20251027/20168357fAWX5YPXOH.png


  1. 偵測規則與 AI 角色(System Prompt)
    這是整個偵測邏輯的靈魂所在,它定義了 AI 必須遵循的規則:

system_prompt = """...""":

這段多行字串定義了 AI 的系統指令。它告訴模型要扮演什麼角色、它的任務(偵測釣魚郵件)、以及它要分析的四個核心面向:

急迫性: 判斷是否有時間壓力。

發信人偽裝: 判斷發信人身份是否可信。

可疑連結/指令: 判斷是否有高風險的操作要求。

不尋常的要求: 判斷是否索取敏感資料。

強制 JSON 格式要求:

在 system_prompt 的結尾,明確要求 AI 必須回傳一個特定結構的 JSON 物件。這個 JSON 結構包括:is_phishing (結果判斷)、confidence_score (信心分數)、analysis (摘要)、以及 red_flags (危險訊號清單)。


  1. 呼叫模型的核心邏輯(client.chat.completions.create)
    這部分是實際與 OpenAI 伺服器溝通的程式碼:

model="gpt-4o":

指定要使用的 LLM 模型。gpt-4o 是目前功能最強大且速度快的模型,適合此類複雜的分析任務。

messages=[...]:

這是聊天模型 API 呼叫中傳遞對話歷史的關鍵結構。這裡我們傳遞了兩條訊息:

{"role": "system", "content": system_prompt}:AI 的人設與規則。

{"role": "user", "content": user_message}:待分析的郵件內容。

response_format={"type": "json_object"}:

這是強制結構化輸出的官方指令。它讓模型知道它唯一的任務就是生成一個 JSON 物件,大大提高了輸出格式的穩定性和可靠性。

return response.choices[0].message.content:

如果 API 呼叫成功,則從回應物件中取出模型生成的 JSON 字串並回傳。


  1. 錯誤處理
    try: ... except Exception as e: ...:

這是一個標準的錯誤處理區塊。它能捕捉在 API 呼叫過程中可能發生的任何問題(例如網路連線失敗、API 金鑰錯誤、模型處理超時等)。如果發生錯誤,它會回傳一條錯誤訊息而不是讓程式崩潰。

https://ithelp.ithome.com.tw/upload/images/20251027/20168357ngFtpJClE0.png

測試範例:
https://ithelp.ithome.com.tw/upload/images/20251027/20168357ksGSfccCPr.png


輸出結果:
https://ithelp.ithome.com.tw/upload/images/20251027/20168357CpH7mDJCE8.png


本篇重點:

1. AI vs. AI (Defense against AI-Generated Threats):

目標: 這是整個專案的動機。傳統過濾器擋不住 AI 寫出的釣魚郵件,所以我們必須利用 LLM(GPT-4o)的語義理解能力,來找出郵件中隱藏的惡意意圖。

嚴格的角色設定與規則 (Prompt Engineering is Key):

2.透過 system_prompt,將 LLM 訓練成一位專業資安分析師。

這個 Prompt 不只是給一段文字,而是給了 AI 四個非常具體的「查案重點」(急迫性、發信人偽裝、連結可疑性、敏感資訊要求),確保它不會亂猜,而是進行系統性的結構化分析。

3.強制結構化輸出 (Enforcing JSON Output):

關鍵參數: 使用 response_format={"type": "json_object"}。

目的:它強制模型只能回傳 JSON 格式的數據,這樣後續的程式才能 reliably(可靠地)讀取 is_phishing、confidence_score 等結果,進行自動化處理。

4.選擇高效能模型 (Model Selection):

模型: 選擇使用 gpt-4o。

原因: 由於偵測釣魚郵件需要高度的判斷力、理解微妙的語氣和長篇內容,選擇功能強大且速度快的模型,可以確保分析結果的準確性和即時性。


最近在學習怎麼訓練模型,剛好可以跟資安防禦結合,用魔法打敗魔法!!!


上一篇
【DAY28】概念分享/資安管理總結
下一篇
【DAY30】30天主題回顧!
系列文
我的30天資安攻之路防身修練:實戰×工具×AI全紀錄30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言